// const s = Symbol()
// console.log(s)

// const s2 = Symbol()
// console.log(s2)

// console.log(s === s2)

// const s3 = Symbol({ a: 'a' })
// console.log(s3)

// const s4 = Symbol('lison')

// console.log(s4.toString())
// console.log(Boolean(s4))
// console.log(!s4)

// let prop = 'name'
// const info = {
//     // name: 'lison'
//     [`my${prop}is`]: 'lison'
// }
// console.log(info)

// const s5 = Symbol('name')
// const info2 = {
//     [s5]: 'lison',
//     age: 18,
//     sex: 'man'
// }
// console.log(info2)
// info2[s5] = 'haha'
// console.log(info2)
// // info2.s5 = 'lison'

// for (const key in info2) {
//     console.log(key)
// }

// console.log(Object.keys(info2))

// console.log(Object.getOwnPropertyNames(info2))

// console.log(JSON.stringify(info2))

// console.log(Object.getOwnPropertySymbols(info2))

// console.log(Reflect.ownKeys(info2))

// Symbol.for() Symbol.keyFor()

const s6 = Symbol('lison')
const s7 = Symbol('lison')

const s8 = Symbol.for('lison')
// const s9 = Symbol.for('lison')
// const s10 = Symbol.for('haha')

// console.log(Symbol.keyFor(s6))

// instanceof
const obj1 = {
    [Symbol.hasInstance](otherObj: any) {
        console.log(otherObj)
    }
}
// console.log({ a: 'a' } instanceof <any>obj1)

// let arr: any[] = [1, 2]
// console.log((<any[]>[]).concat(arr, [3, 4]))
// console.log(arr[(<any>Symbol.isConcatSpreadable)])
// arr[(<any>Symbol.isConcatSpreadable)] = false
// console.log((<any[]>[]).concat(arr, [3, 4]))
// console.log(arr[(<any>Symbol.isConcatSpreadable)])

class C extends Array {
    constructor(...arg: any[]) {
        super(...arg)
    }
    static get [Symbol.species]() {
        return Array
    }
    getName() {
        return 'lison'
    }
}
const c = new C(1, 2, 3)
const a = c.map(item => item + 1)
// console.log(a)
// console.log(a instanceof C);
// console.log(a instanceof Array);

let obj3 = {
    [Symbol.match](string: string): void {
        // console.log(string.length)
    },
    [Symbol.split](string: string): void {
        // console.log('split', string.length)
    }
}
'abcde'.match(<RegExp>obj3)

// Symbol.replace
// Symbol.search
// Symbol.split

'abcde'.split(<any>obj3)

let obj4: unknown = {
    [Symbol.toPrimitive](type: any) {
        console.log(type)
    }
}
// const res = (<number>obj4)++
// const res = `abc${obj4}`


let obj5 = {
    [Symbol.toStringTag]() {
        return 'lison'
    }
}
// console.log(obj5.toString())

const obj6 = {
    a: 'a',
    b: 'b',
}
console.log(Array.prototype[Symbol.unscopables])